#ifndef IBUSADAPTER_H
#define IBUSADAPTER_H

#include "inputcontext.h"  // 引入输入核心逻辑

#include <QObject>
#include <QDBusInterface>
#include <QDBusReply>
#include <QVector>
#include <QString>


// IBus 候选词结构（适配DBus参数格式）
struct IBusCandidate {
    QString text;       // 候选词文本
    QString comment;    // 候选词注释（如拼音，可选）
};

class IBusAdapter : public QObject {
    Q_OBJECT
    // 声明DBus接口（遵循IBus引擎规范）
    Q_CLASSINFO("D-Bus Interface", "org.freedesktop.IBus.Engine")
public:
    explicit IBusAdapter(InputContext* inputCtx, QObject* parent = nullptr);
    ~IBusAdapter() override;

    // 连接IBus服务
    bool connectToIBus();
    // 注册为IBus输入法引擎
    bool registerEngine(const QString& engineName);

signals:
    // 向InputContext转发IBus键盘事件
    void ibusKeyEvent(int keyVal, int keyCode, Qt::KeyboardModifiers modifiers, bool isPressed);

public slots:
    // 接收InputContext生成的候选词，同步到IBus
    void onCandidatesUpdated(const QVector<PinyinCandidate>& candidates);
    // 接收InputContext的输入状态变更，更新IBus状态
    void onInputStateChanged(const InputState& state);

    // IBus DBus接口（供IBus调用）
    Q_SCRIPTABLE void ProcessKeyEvent(int keyVal, int keyCode, uint modifiers, bool isPressed, uint timestamp);
    Q_SCRIPTABLE void SetCapabilities(uint capabilities);
    Q_SCRIPTABLE void FocusIn();
    Q_SCRIPTABLE void FocusOut();
    Q_SCRIPTABLE void Reset();

private:
    // 发送候选词到IBus
    void sendCandidatesToIBus(const QVector<IBusCandidate>& candidates);
    // 发送输入文本到IBus（正在输入的拼音/已确认的汉字）
    void sendTextToIBus(const QString& text, bool isComposition = true);

    InputContext* m_inputCtx;               // 关联的输入核心
    QDBusInterface* m_ibusBusInterface;     // IBus总线接口（用于注册引擎）
    QDBusInterface* m_ibusEngineInterface;  // IBus引擎接口（用于处理输入）
    QString m_enginePath;                   // IBus引擎对象路径（如/org/freedesktop/IBus/Engine/scSmartInput）
    QVector<IBusCandidate> m_ibusCandidates;  // IBus候选词缓存
    bool m_isFocused;                       // 是否有输入焦点
};

#endif  // IBUSADAPTER_H